home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 25 / AACD 25.iso / AACD / Magazine / Online / QMail / source / substdi.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-15  |  1.6 KB  |  92 lines

  1. #include "substdio.h"
  2. #include "byte.h"
  3. #include "error.h"
  4.  
  5. static int oneread(op,fd,buf,len)
  6. register int (*op)();
  7. register int fd;
  8. register char *buf;
  9. register int len;
  10. {
  11.   register int r;
  12.  
  13.   for (;;) {
  14.     r = op(fd,buf,len);
  15.     if (r == -1) if (errno == error_intr) continue;
  16.     return r;
  17.   }
  18. }
  19.  
  20. static int getthis(s,buf,len)
  21. register substdio *s;
  22. register char *buf;
  23. register int len;
  24. {
  25.   register int r;
  26.   register int q;
  27.  
  28.   r = s->p;
  29.   q = r - len;
  30.   if (q > 0) { r = len; s->p = q; } else s->p = 0;
  31.   byte_copy(buf,r,s->x + s->n);
  32.   s->n += r;
  33.   return r;
  34. }
  35.  
  36. int substdio_feed(s)
  37. register substdio *s;
  38. {
  39.   register int r;
  40.   register int q;
  41.  
  42.   if (s->p) return s->p;
  43.   q = s->n;
  44.   r = oneread(s->op,s->fd,s->x,q);
  45.   if (r <= 0) return r;
  46.   s->p = r;
  47.   q -= r;
  48.   s->n = q;
  49.   if (q > 0) /* damn, gotta shift */ byte_copyr(s->x + q,r,s->x);
  50.   return r;
  51. }
  52.  
  53. int substdio_bget(s,buf,len)
  54. register substdio *s;
  55. register char *buf;
  56. register int len;
  57. {
  58.   register int r;
  59.  
  60.   if (s->p > 0) return getthis(s,buf,len);
  61.   r = s->n; if (r <= len) return oneread(s->op,s->fd,buf,r);
  62.   r = substdio_feed(s); if (r <= 0) return r;
  63.   return getthis(s,buf,len);
  64. }
  65.  
  66. int substdio_get(s,buf,len)
  67. register substdio *s;
  68. register char *buf;
  69. register int len;
  70. {
  71.   register int r;
  72.  
  73.   if (s->p > 0) return getthis(s,buf,len);
  74.   if (s->n <= len) return oneread(s->op,s->fd,buf,len);
  75.   r = substdio_feed(s); if (r <= 0) return r;
  76.   return getthis(s,buf,len);
  77. }
  78.  
  79. char *substdio_peek(s)
  80. register substdio *s;
  81. {
  82.   return s->x + s->n;
  83. }
  84.  
  85. void substdio_seek(s,len)
  86. register substdio *s;
  87. register int len;
  88. {
  89.   s->n += len;
  90.   s->p -= len;
  91. }
  92.